#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include "RingQueue.hpp"

void *consumer(void *args)
{
    RingQueue<int> *rq = static_cast<RingQueue<int> *>(args);

    while (true)
    {
        // sleep(3);
        // 1. 消费任务
        int t = 0;
        rq->Pop(&t);
        std::cout << "接受了一个任务 " << t << std::endl;
        // 2. 处理任务 -- 处理任务的时候，这个任务，已经被拿到线程的上下文中了,不属于队列了
        // t();
    }
}

void *productor(void *args)
{
    RingQueue<int> *rq = static_cast<RingQueue<int> *>(args);
    int data = 0;
    while (true)
    {
        // sleep(1);
        // 1. 获得任务
        // std::cout << "生产了一个任务: " << x << "+" << y << "=?" << std::endl;
        std::cout << "生产了一个任务: " << data << std::endl;

        // 2. 生产任务
        rq->Equeue(data);
        data++;
    }
}

int main()
{
    // 扩展认识: 阻塞队列: 可以放任务吗？
    // 申请阻塞队列
    RingQueue<int> *rq = new RingQueue<int>();

    // 构建生产和消费者
    pthread_t c[2], p[3];

    pthread_create(c, nullptr, consumer, rq);
    pthread_create(c + 1, nullptr, consumer, rq);
    pthread_create(p, nullptr, productor, rq);
    pthread_create(p + 1, nullptr, productor, rq);
    pthread_create(p + 2, nullptr, productor, rq);

    pthread_join(c[0], nullptr);
    pthread_join(c[1], nullptr);
    pthread_join(p[0], nullptr);
    pthread_join(p[1], nullptr);
    pthread_join(p[2], nullptr);

    return 0;
}

// void* consumer(void* args)
// {
//     BlockQueue<Task>* bq = static_cast<BlockQueue<Task>*>(args);
//     while(true)
//     {
//         sleep(1);
//         Task t = bq->Pop();
//         t.Execute();
//         std::cout << "接受了一个任务 " << t.X() << "+" << t.Y() << "=" << t.Result() << std::endl;
//     }
// }

// void* producer(void* args)
// {
//     int x = 1, y = 1;
//     BlockQueue<Task>* bq = static_cast<BlockQueue<Task>*>(args);
//     while(true)
//     {
//         Task t(x, y);
//         bq->Equeue(t);
//         std::cout << "发布了一个任务： " << x++ << "+" << y++ << "=?" << std::endl;
//     }
// }

// int main()
// {
//     BlockQueue<Task> *bq = new BlockQueue<Task>();

//     pthread_t c, p;
//     pthread_create(&c, nullptr, consumer, bq);
//     pthread_create(&p, nullptr, producer, bq);

//     pthread_join(c, nullptr);
//     pthread_join(p, nullptr);

//     delete bq;
//     return 0;
// }